﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ImobitechModel.com.Constantes;
using ImobitechModel.Facade;
using ImobitechDao;
using System.Globalization;

namespace ImobitechModel.com.Controller
{
    public class ControladorGestao
    {
        public Object retornaCategorias()
        {
            GestaoFacade _gestaoFacade = GestaoFacade.getInstance();
            return _gestaoFacade.retornaCategorias();
        }

        public Object retornaCategoria(int id)
        {
            GestaoFacade _gestaoFacade = GestaoFacade.getInstance();
            return _gestaoFacade.retornaCategoria(id);
        }

        public Object cadastrarConta(ContasValues values)
        {
            Contas conta = new Contas();

            conta.descricao = values.descricao;

            conta.St_tipo = values.tipo;
            conta.Dt_Cadastro = DateTime.Now;
            conta.St_tipoConta = values.tipoConta;
            conta.St_Ativo = true;
            conta.NumeroParcela = values.numeroParcelas;
            conta.CategoriaConta = (CategoriaConta)retornaCategoria(values.categoria);

            if (conta.St_tipoConta.Equals(2))
            {
                for (int index = 0; index < 100; index++)
                {
                    ParcelaConta parcelas = new ParcelaConta();

                    parcelas.Acrescimo = values.parcelas[0].acrescimo;
                    parcelas.Desconto = values.parcelas[0].desconto;
                    parcelas.Dt_vencimento = values.parcelas[0].vencimento.AddMonths(index);
                    parcelas.Valor = values.parcelas[0].valor;
                    parcelas.St_Pago = false;
                    conta.ParcelaConta.Add(parcelas);
                }

            }
            else if (conta.St_tipoConta.Equals(3))
            {
                for (int index = 0; index < 20; index++)
                {
                    ParcelaConta parcelas = new ParcelaConta();

                    parcelas.Acrescimo = values.parcelas[0].acrescimo;
                    parcelas.Desconto = values.parcelas[0].desconto;
                    parcelas.Dt_vencimento = values.parcelas[0].vencimento.AddYears(index);
                    parcelas.Valor = values.parcelas[0].valor;

                    conta.ParcelaConta.Add(parcelas);
                }

            }
            else
            {
                for (int index = 0; index < values.parcelas.Count; index++)
                {
                    ParcelaConta parcelas = new ParcelaConta();

                    parcelas.Acrescimo = values.parcelas[index].acrescimo;
                    parcelas.Desconto = values.parcelas[index].desconto;
                    parcelas.Dt_vencimento = values.parcelas[index].vencimento;
                    parcelas.Valor = values.parcelas[index].valor;

                    conta.ParcelaConta.Add(parcelas);
                }
            }

            //for (int index = 0; index < values.parcelas.Count; index++)
            //{
            //    ParcelaConta parcelas = new ParcelaConta();

            //    parcelas.Acrescimo = values.parcelas[index].acrescimo;
            //    parcelas.Desconto = values.parcelas[index].desconto;
            //    parcelas.Dt_vencimento = values.parcelas[index].vencimento;
            //    parcelas.Valor = values.parcelas[index].valor;

            //    conta.ParcelaConta.Add(parcelas);
            //}

            //if (conta.St_tipoConta.Equals(2) || conta.St_tipoConta.Equals(3))
            //{
            //    Parcelas parcela = values.parcelas.First();
            //    conta.Dt_Vencimento = parcela.vencimento;
            //    conta.valor = (parcela.valor + parcela.acrescimo) - parcela.desconto;
            //}


            GestaoFacade _gestaoFacade = GestaoFacade.getInstance();
            return _gestaoFacade.cadastrarConta(conta);
        }

        public Object retornaFluxo(int mes, int tipo)
        {
            List<CategoriaConta> categorias = (List<CategoriaConta>)retornaCategorias();

            GestaoFacade _gestaoFacade = GestaoFacade.getInstance();

            //geral
            List<Tuple<decimal, decimal, decimal, int>> fluxoNormal = (List<Tuple<decimal, decimal, decimal, int>>)_gestaoFacade.retornaFluxo(mes, categorias, tipo);

            List<Fluxo> listFluxo = new List<Fluxo>();

            for (int index = 0; index < categorias.Count; index++)
            {
                Fluxo fluxo = new Fluxo();

                //fluxo.categoria = categorias[index].Id;
                fluxo.descricao = categorias[index].categoria;

                fluxo.valor = fluxoNormal.Where(p => p.Item4 == categorias[index].Id).Sum(p => (p.Item1 + p.Item2) - p.Item3);
                listFluxo.Add(fluxo);
            }

            return listFluxo;
        }

        public Object retornaFluxo(int mes, int ano, int categoria, int tipo)
        {
            GestaoFacade _gestaoFacade = GestaoFacade.getInstance();

            List<fluxoCaixa> fluxoNormal =
                (List<fluxoCaixa>)_gestaoFacade.retornaFluxo(mes, ano, categoria, tipo);

            List<Fluxo> listFluxo = new List<Fluxo>();

            for (int index = 0; index < fluxoNormal.Count; index++)
            {
                Fluxo fluxo = new Fluxo();

                fluxo.descricao = fluxoNormal[index].descricao;
                fluxo.id = fluxoNormal[index].id;

                fluxo.valor = (fluxoNormal[index].valor - fluxoNormal[index].acrescimo) + fluxoNormal[index].desconto;
                fluxo.pago = fluxoNormal[index].pago;
                fluxo.vencimento = fluxoNormal[index].vencimento;
                listFluxo.Add(fluxo);
            }

            return listFluxo;
        }

        public Object retornaConta(int id)
        {
            GestaoFacade _gestaoFacade = GestaoFacade.getInstance();

            Contas conta = (Contas)_gestaoFacade.retornaConta(id);

            ContasValues values = new ContasValues(conta.St_tipo);
            values.categoria = conta.CategoriaConta.Id;
            values.descricao = conta.descricao;
            values.numeroParcelas = conta.NumeroParcela;

            values.tipoConta = conta.St_tipoConta;
            int i = 0;
            foreach (ParcelaConta parcelas in conta.ParcelaConta)
            {
                Parcelas parcela = new Parcelas();

                parcela.acrescimoFormat = Util.formatMoney(parcelas.Acrescimo);
                parcela.descontoFormat = Util.formatMoney(parcelas.Desconto);
                parcela.valorFormat = Util.formatMoney(parcelas.Valor);
                parcela.vencimentoFormat = Util.formatDate(parcelas.Dt_vencimento);
                parcela.id = parcelas.Id;
                parcela.pago = parcelas.St_Pago;
                parcela.valorpago = parcelas.valor_pago.HasValue ? Util.formatMoney(parcelas.valor_pago.Value) : "";

                parcela.datapago = parcelas.Dt_pagamento.HasValue ? Util.formatDate(parcelas.Dt_pagamento.Value) : "";
                values.parcelas.Add(parcela);

                i++;

                if (i == 10)
                    break;
            }


            return values;

        }

        public Object pagaConta(int id, DateTime dataPagamento, decimal valorPago)
        {
            GestaoFacade _gestaoFacade = GestaoFacade.getInstance();
            ParcelaConta parcela = (ParcelaConta)_gestaoFacade.retornaParcela(id);

            parcela.Dt_pagamento = dataPagamento;
            parcela.valor_pago = valorPago;
            parcela.St_Pago = true;

            return _gestaoFacade.updateParcela(parcela);
        }

        public Object retornaVisitas(int id)
        {

            ControladorPerfis cg = new ControladorPerfis();
            Pessoa_Papel papel = (Pessoa_Papel)cg.retornaPapel(id);

            GestaoFacade _gestaoFacade = GestaoFacade.getInstance();
            List<Visita> visita = (List<Visita>)_gestaoFacade.retornaVisitas(papel);
            List<VisitasFuncionarios> visitas = new List<VisitasFuncionarios>();

            for (int index = 0; index < visita.Count; index++)
            {
                VisitasFuncionarios visitaRetorno = new VisitasFuncionarios();
                visitaRetorno.Cliente = visita[index].Pessoa_Papel.Pessoa.Name;
                visitaRetorno.dataVisita = visita[index].DataVisita;
                visitaRetorno.endereco = visita[index].Imovel.Endereço;
                visitaRetorno.id = visita[index].Id;
                visitaRetorno.imovel = visita[index].Imovel.Id;

                visitas.Add(visitaRetorno);
            }
            return visitas;
        }

        public object buscaImovel(string cidade, string endereco, string[] bairro, int tipoImovel, string estado, int areaprivada, string nomeDono)
        {
            GestaoFacade gestaoFacade = GestaoFacade.getInstance();



            List<Imoveis> imoveisList = new List<Imoveis>();
            List<Imovel> imoveis = (List<Imovel>)gestaoFacade.retornaImoveis(cidade, endereco, bairro, tipoImovel, estado, areaprivada, nomeDono);

            for (int i = 0; i < imoveis.Count; i++)
            {
                Imoveis imovel = new Imoveis();

                imovel.cidade = imoveis[i].Cidade;
                imovel.endereco = imoveis[i].Endereço;
                imovel.bairro = imoveis[i].Bairro;
                imovel.tipoImovel = imoveis[i].Tipo_Imovel.descricao;
                imovel.estado = imoveis[i].Estado;
                imovel.areaPrivada = imoveis[i].AreaPrivada.HasValue ? imoveis[i].AreaPrivada.Value : 0;
                imovel.id = imoveis[i].Id;
                imovel.dono = imoveis[i].Pessoa_Papel_Imovel.First(p => p.Pessoa_Papel.Papel.Nome == "Dono").Pessoa_Papel.Pessoa.Name;
                imoveisList.Add(imovel);
            }

            return imoveisList;

        }

        public object buscaImovel(int id)
        {
            GestaoFacade gestaoFacade = GestaoFacade.getInstance();

            Imoveis imovelRetorno = new Imoveis();
            Imovel imovel = (Imovel)gestaoFacade.retornaImoveis(id);

            imovelRetorno.cidade = imovel.Cidade;
            imovelRetorno.endereco = imovel.Endereço;
            imovelRetorno.bairro = imovel.Bairro;
            imovelRetorno.tipoImovel = imovel.Tipo_Imovel.descricao;
            imovelRetorno.estado = imovel.Estado;
            imovelRetorno.areaPrivada = imovel.AreaPrivada.HasValue ? imovel.AreaPrivada.Value : 0;
            imovelRetorno.id = imovel.Id;
            imovelRetorno.dono = imovel.Pessoa_Papel_Imovel.First(p => p.Pessoa_Papel.Papel.Nome == "Dono").Pessoa_Papel.Pessoa.Name;

            imovelRetorno.complemento = imovel.Complemento;
            imovelRetorno.referencia = imovel.Referencia;
            imovelRetorno.quartos = imovel.Quartos.Value;
            imovelRetorno.existeSuite = imovel.Suite.Value;
            imovelRetorno.suite = imovel.Suite.Value ? imovel.QuartosSuite.Value : 0;
            imovelRetorno.existeGaragem = imovel.Garagem.Value;
            imovelRetorno.garagem = imovel.NumeroGaragem.Value;
            imovelRetorno.areaTotal = imovel.AreaTotal;

            //for (int index = 0; index < imovel.Imovel_Dependencia.Count; imovel++)
            foreach (Imovel_Dependencia depedencia in imovel.Imovel_Dependencia)
            {
                ListaDependencias depe = new ListaDependencias();
                depe.id = depedencia.Dependencias.Id;
                depe.descricao = depedencia.Dependencias.descricao;
                imovelRetorno.dependencias.Add(depe);
            }

            return imovelRetorno;
        }

        public Object buscaAnuncios(int idImovel)
        {
            GestaoFacade _gestaoFacade = GestaoFacade.getInstance();

            List<Anuncio> anuncios = (List<Anuncio>)_gestaoFacade.retornaAnuncios(idImovel);
            List<Anunciar> listAnunciar = new List<Anunciar>();

            for (int index = 0; index < anuncios.Count; index++)
            {
                Anunciar anunciar = new Anunciar();
                anunciar.id = anuncios[index].Id;
                anunciar.descricao = anuncios[index].Descricao;
                anunciar.valor = anuncios[index].Valor;
                //anunciar.caminho = anuncios[index].cami
                anunciar.idImovel = anuncios[index].Imovel.Id;
                //anunciar.url = anuncios[index].
                anunciar.dtCadastro = anuncios[index].DT_Cadastro;
                anunciar.tipo = anuncios[index].Tipo;
                if (anunciar.tipo == 1)
                    anunciar.tipoTexto = "Venda";
                else
                    anunciar.tipoTexto = "Aluguel";
                anunciar.stAprovado = anuncios[index].St_Aprovado;
                anunciar.descricaCurta = anuncios[index].DescricaoCurta;
                listAnunciar.Add(anunciar);
            }

            return listAnunciar;
        }

        public Object buscaAnuncio(int id)
        {
            GestaoFacade _gestaoFacade = GestaoFacade.getInstance();

            Anuncio anuncio = (Anuncio)_gestaoFacade.retornaAnuncio(id);
            Anunciar anunciar = new Anunciar();

            anunciar.id = anuncio.Id;
            anunciar.descricao = anuncio.Descricao;
            anunciar.valor = anuncio.Valor;
            //anunciar.caminho = anuncio.cami
            anunciar.idImovel = anuncio.Imovel.Id;
            //anunciar.url = anuncio.
            anunciar.dtCadastro = anuncio.DT_Cadastro;
            anunciar.tipo = anuncio.Tipo;
            if (anunciar.tipo == 1)
                anunciar.tipoTexto = "Venda";
            else
                anunciar.tipoTexto = "Aluguel";
            anunciar.stAprovado = anuncio.St_Aprovado;
            anunciar.descricaCurta = anuncio.DescricaoCurta;
            anunciar.stAtivo = anuncio.St_Ativo;
            return anunciar;
        }

        public Object editaAnuncio(IDictionary<string, string> values)
        {
            int id = int.Parse(values.First(p => p.Key == NomeCampoConstantes.campo_AnuncioId).Value);

            GestaoFacade _gestaoFacade = GestaoFacade.getInstance();
            Anuncio anuncio = (Anuncio)_gestaoFacade.retornaAnuncio(id);

            anuncio.Descricao = values.First(p => p.Key == NomeCampoConstantes.campo_AnuncioDescricao).Value;
            anuncio.St_Ativo = values.First(p => p.Key == NomeCampoConstantes.campo_AnuncioSt_Ativo).Value == "1" ? true : false;

            anuncio.Valor = double.Parse(values.First(p => p.Key == NomeCampoConstantes.campo_AnuncioValor).Value.Replace("R$ ", ""));
            anuncio.Tipo = int.Parse(values.First(p => p.Key == NomeCampoConstantes.campo_AnuncioTipo).Value);
            anuncio.St_Aprovado = values.First(p => p.Key == NomeCampoConstantes.campo_AnuncioSt_Aprovado).Value == "1" ? true : false;
            anuncio.DescricaoCurta = values.First(p => p.Key == NomeCampoConstantes.campo_AnuncioDescricaocurta).Value;
            return _gestaoFacade.editaAnuncio(anuncio);
        }

        public Object retornaCandidatos()
        {
            GestaoFacade cg = GestaoFacade.getInstance();
            List<Candidato> candidatos = (List<Candidato>)cg.retornaCandidatos();
            List<ImobitechModel.com.Constantes.Candidatos> candidatoRetorno = new List<Candidatos>();

            foreach (Candidato candidato in candidatos)
            {
                ImobitechModel.com.Constantes.Candidatos aux = new Candidatos();
                aux.dataCandidatura = candidato.Dt_Candaditar;
                aux.endereco = candidato.Anuncio.Imovel.Endereço;
                aux.id = candidato.Id;
                aux.idImovel = candidato.Anuncio.Imovel.Id;
                aux.idPessoaPapel = candidato.Pessoa_Papel.Id;
                aux.nomeCandidato = candidato.Pessoa_Papel.Pessoa.Name + " " + candidato.Pessoa_Papel.Pessoa.LastName;
                aux.idAnuncio = candidato.Anuncio.Id;
                aux.idPessoa = candidato.Pessoa_Papel.Pessoa.Id;
                candidatoRetorno.Add(aux);
            }

            return candidatoRetorno;
        }

        public Object aceitarCandidato(int id)
        {
            GestaoFacade _gestaoFacade = GestaoFacade.getInstance();
            Candidato candidato = (Candidato)_gestaoFacade.retornaCandidato(id);

            Pessoa_Papel pessoaPapel = inserirPerfilCandidato(candidato);

            Pessoa_Papel_Imovel pessoaImovel = new Pessoa_Papel_Imovel();
            pessoaImovel.Pessoa_Papel = pessoaPapel;
            pessoaImovel.Imovel = candidato.Anuncio.Imovel;
            _gestaoFacade.cadastrarPapelImovel(pessoaImovel);

            Contas conta = new Contas();
            Contas contaPagar = new Contas();
            ContaImovel contaImovel = new ContaImovel();

            DateTime mes = DateTime.Now;
            DateTime primeiroDia = Convert.ToDateTime("01/" + mes.ToString("MM/yyyy"));
            DateTime ultimoDia = primeiroDia.AddMonths(1).AddDays(-1);

            if (candidato.Anuncio.Tipo == 2)
            {
                conta.descricao = "Aluguel " + candidato.Anuncio.Id;
                contaPagar.descricao = "Repasse ao dono do Imóvel " + candidato.Anuncio.Id;

                conta.St_tipo = 2;
                conta.Dt_Cadastro = DateTime.Now;

                conta.St_tipoConta = 2;
                conta.St_Ativo = true;
                conta.NumeroParcela = 1;
                conta.CategoriaConta = (CategoriaConta)retornaCategoria(5);

                contaPagar.St_tipo = 1;
                contaPagar.Dt_Cadastro = DateTime.Now;

                contaPagar.St_tipoConta = 2;
                contaPagar.St_Ativo = true;
                contaPagar.NumeroParcela = 1;
                contaPagar.CategoriaConta = (CategoriaConta)retornaCategoria(5);

                for (int index = 0; index < 100; index++)
                {
                    ParcelaConta parcelas = new ParcelaConta();
                    ParcelaConta parcelaPagar = new ParcelaConta();

                    parcelas.Acrescimo = 0;
                    parcelas.Desconto = decimal.Parse((candidato.Anuncio.Valor).ToString());
                    parcelas.Dt_vencimento = ultimoDia.AddMonths(index);
                    parcelas.Valor = decimal.Parse(candidato.Anuncio.Valor.ToString());
                    parcelas.St_Pago = false;

                    parcelaPagar.Acrescimo = 0;
                    parcelaPagar.Desconto = 0;
                    parcelaPagar.Dt_vencimento = ultimoDia.AddMonths(index);
                    parcelaPagar.Valor = decimal.Parse((candidato.Anuncio.Valor - (candidato.Anuncio.Valor * 0.10)).ToString());
                    parcelaPagar.St_Pago = false;

                    conta.ParcelaConta.Add(parcelas);
                    contaPagar.ParcelaConta.Add(parcelaPagar);
                }
            }
            else
            {
                conta.descricao = "Venda " + candidato.Anuncio.Id;

                contaPagar.descricao = "Repasse ao dono do Imóvel " + candidato.Anuncio.Id;

                conta.St_tipo = 2;
                conta.Dt_Cadastro = DateTime.Now;

                conta.St_tipoConta = 2;
                conta.St_Ativo = true;
                conta.NumeroParcela = 1;
                conta.CategoriaConta = (CategoriaConta)retornaCategoria(6);

                contaPagar.St_tipo = 1;
                contaPagar.Dt_Cadastro = DateTime.Now;

                contaPagar.St_tipoConta = 2;
                contaPagar.St_Ativo = true;
                contaPagar.NumeroParcela = 1;
                contaPagar.CategoriaConta = (CategoriaConta)retornaCategoria(5);


                ParcelaConta parcelas = new ParcelaConta();
                ParcelaConta parcelaPagar = new ParcelaConta();

                parcelas.Acrescimo = 0;
                parcelas.Desconto = decimal.Parse((candidato.Anuncio.Valor * 0.10).ToString());

                parcelas.Dt_vencimento = ultimoDia.AddMonths(0);
                parcelas.Valor = decimal.Parse(candidato.Anuncio.Valor.ToString());
                parcelas.St_Pago = false;

                parcelaPagar.Acrescimo = 0;
                parcelaPagar.Desconto = 0;
                parcelaPagar.Dt_vencimento = ultimoDia.AddMonths(0);
                parcelaPagar.Valor = decimal.Parse((candidato.Anuncio.Valor - (candidato.Anuncio.Valor * 0.10)).ToString());
                parcelaPagar.St_Pago = false;

                conta.ParcelaConta.Add(parcelas);
                contaPagar.ParcelaConta.Add(parcelaPagar);
            }

            contaImovel.Imovel = candidato.Anuncio.Imovel;

            conta.ContaImovel.Add(contaImovel);

            _gestaoFacade.cadastrarConta(conta);

            AnuncioFacade _anuncioFacade = AnuncioFacade.getInstance();
            candidato.Anuncio.St_Ativo = false;
            _anuncioFacade.atualizaAnuncio(candidato.Anuncio);

            _gestaoFacade.retirarcandidato(candidato.Id);

            return null;
        }

        private Pessoa_Papel inserirPerfilCandidato(Candidato candidato)
        {
            Pessoa pessoa = candidato.Pessoa_Papel.Pessoa;

            //3- locatario
            // 8 - comprador
            ControladorPerfis cgPerfil = new ControladorPerfis();
            Papel papel = new Papel();
            if (candidato.Anuncio.Tipo == 2)
                papel = (Papel)cgPerfil.retornaPapelbyId(3);
            else
                papel = (Papel)cgPerfil.retornaPapelbyId(8);

            Pessoa_Papel pessoaPapel = new Pessoa_Papel();
            pessoaPapel.Papel = papel;
            //pessoaPapel.Dados_Pessoa_Papel = new System.Data.Objects.DataClasses.EntityCollection<Dados_Pessoa_Papel>();
            List<Dados_Pessoa_Papel> dadosList = candidato.Pessoa_Papel.Dados_Pessoa_Papel.ToList();
            foreach (Dados_Pessoa_Papel dados in dadosList)
            {
                Dados_Pessoa_Papel dadosAux = dados;
                pessoaPapel.Dados_Pessoa_Papel.Add(dadosAux);
            }
            //pessoa.Pessoa_Papel.Add(pessoaPapel);

            pessoaPapel.Pessoa = pessoa;

            PerfilFacade _perfilFacade = PerfilFacade.getInstance();
            _perfilFacade.insertPerfil(pessoaPapel);

            return pessoaPapel;
        }

        public void retirarCandidato(int id)
        {
            GestaoFacade _gestaoFacade = GestaoFacade.getInstance();
            Candidato candidato = (Candidato)_gestaoFacade.retornaCandidato(id);
            _gestaoFacade.retirarcandidato(candidato.Id);
        }

        public Object buscaLocatarios()
        {
            GestaoFacade cg = GestaoFacade.getInstance();
            List<Pessoa_Papel_Imovel> locatarios = (List<Pessoa_Papel_Imovel>)cg.buscaLocatarios();
            List<Locatario> locatariosRetorno = new List<Locatario>();

            foreach (Pessoa_Papel_Imovel locatario in locatarios)
            {
                Locatario aux = new Locatario();
                aux.id = locatario.Pessoa_Papel.Pessoa.Id;
                aux.nome = locatario.Pessoa_Papel.Pessoa.Name;
                aux.idImovel = locatario.Imovel.Id;
                aux.endereco = locatario.Imovel.Endereço;

                locatariosRetorno.Add(aux);
            }

            return locatariosRetorno;
        }


        public Object buscarReparoConserto()
        {
            ImovelFacade _imovelfacade = ImovelFacade.getInstance();

            List<ReparoConserto> reparoConsertos = (List<ReparoConserto>)_imovelfacade.buscaReparoConserto();

            List<Reparos> reparos = new List<Reparos>();

            foreach (ReparoConserto reparoConserto in reparoConsertos)
            {
                Reparos reparo = new Reparos();

                reparo.id = reparoConserto.Id;
                reparo.aprovado = reparoConserto.st_Aprovado;
                reparo.dependencia = reparoConserto.dependencia;
                reparo.tipo = reparoConserto.st_tipo == 1 ? "Reparo" : "Conserto";
                reparo.realizado = reparoConserto.st_realizado;
                reparo.arquivo = "~/Imovel/uploadReparo/" + reparoConserto.Id + "/" + reparoConserto.arquivo;
                reparo.arquivo2 = "~/Imovel/uploadReparo/" + reparoConserto.Id + "/" + reparoConserto.arquivo1;
                reparo.arquivo3 = "~/Imovel/uploadReparo/" + reparoConserto.Id + "/" + reparoConserto.arquivo2;
                reparos.Add(reparo);
            }

            return reparos;
        }

        public Object acaorealizado(int id)
        {
            ImovelFacade _imovelFacade = ImovelFacade.getInstance();
            ReparoConserto reparoConserto = (ReparoConserto)_imovelFacade.recuperarReparoConserto(id);

            reparoConserto.st_realizado = true;

            return _imovelFacade.atualizarReparoConserto(reparoConserto);
        }

        public Object acaoAprovar(int id, decimal valor)
        {
            ImovelFacade _imovelFacade = ImovelFacade.getInstance();
            ReparoConserto reparoConserto = (ReparoConserto)_imovelFacade.recuperarReparoConserto(id);

            reparoConserto.st_Aprovado = true;
            reparoConserto.valorAprovado = valor;

            return _imovelFacade.atualizarReparoConserto(reparoConserto);
        }

        public Object baixaBoleto(int id)
        {
            ImovelFacade _imovelFacade = ImovelFacade.getInstance();
            ReparoConserto reparoConserto = (ReparoConserto)_imovelFacade.recuperarReparoConserto(id);

            ContaImovel contasImoveis = reparoConserto.Imovel.ContaImovel.FirstOrDefault();

            ParcelaConta parcelas = contasImoveis.Contas.ParcelaConta.Where(p => p.Dt_vencimento > DateTime.Now.AddDays(10) && p.St_Pago == false).FirstOrDefault();
            GestaoFacade _gestaoFacade = GestaoFacade.getInstance();
            if (parcelas.Valor > reparoConserto.valorAprovado)
            {
                parcelas.Desconto = reparoConserto.valorAprovado.Value;
                _gestaoFacade.updateParcela(parcelas);
            }
            else
            {
                parcelas.Desconto = parcelas.Valor;
                ParcelaConta parcelas2 = contasImoveis.Contas.ParcelaConta.Where(p => p.Dt_vencimento > DateTime.Now.AddDays(10) && p.St_Pago == false).ToList()[1];
                parcelas2.Desconto = reparoConserto.valorAprovado.Value - parcelas.Valor;
                _gestaoFacade.updateParcela(parcelas);
                _gestaoFacade.updateParcela(parcelas2);
            }

            return null;
        }
    }
}
